package com.best4cloud.common.core.result;

import com.best4cloud.common.core.result.enums.ResultErrorCode;
import com.best4cloud.common.core.utils.IPAddressUtils;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Data;
import lombok.SneakyThrows;

import java.io.Serializable;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.time.Instant;

/**
 * 响应消息, 响应请求结果给客户端
 *
 * @since 1.0
 */
@Data
@Builder(access = AccessLevel.PRIVATE)
public class Result<T> implements Serializable {

    /**
     * 请求是否成功
     */
    private boolean success;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 错误类型码
     */
    private ResultErrorCode errorCode;

    /**
     * 错误信息
     */
    private String errorMessage;

    /**
     * 时间戳
     */
    private Instant timestamp;

    /**
     * 响应服务器地址
     */
    private String host;

    /**
     * TraceId
     */
    private String traceId;

    /**
     * 前端显示效果类型
     * 0: 静默
     * 1: 警告信息
     * 2: 异常信息
     * 3: 弹窗
     * 9: 跳转页面
     */
    private Integer showType;

    /**
     * 成功结果
     * @param data 数据对象
     * @param <T> 数据对象类型
     * @return 返回结果对象
     */
    public static <T> Result<T> success(T data){
        return Result.<T>builder()
                .success(true)
                .data(data)
                .timestamp(Instant.now())
                .build();
    }

    @SneakyThrows
    public static <T> Result<T> error(ResultErrorCode resultErrorCode, String errorMessage) {
        return Result.<T>builder()
                .success(false)
                .errorCode(resultErrorCode)
                .errorMessage(errorMessage)
                .timestamp(Instant.now())
                .traceId(null)
                .host(IPAddressUtils.getLocalHostLANAddress().getHostAddress())
                .build();
    }

}
